package es.ucm.fdi.bdt.controller.interfaces.management;

/**
 * Gestión de facturas
 */
public interface IBillingManager {

	/**
	 * Funci�n: Efectuar pago
		ID: Fac01
		Prioridad: Alta.
		Estabilidad: Media.
		Descripci�n: Se efect�a el pago tras la realizaci�n de un servicio ofertado.
		Entrada: ID del servicio.
		Salida: Notificaci�n de �xito/fallo.
		Origen: Interfaz gr�fica.
		Destino: Sistema.
		Necesita: Estar conectado a la red y los siguientes ficheros: contratos.txt, transacciones.txt, rep_man_publico.txt, cuentas.txt.
		Acci�n: El deudor descarga el fichero de contratos.txt, lo modifica agregando n�mero de horas trabajadas y multiplicador, lo firma digitalmente y lo sube a la red P2P estructurada. El acreedor a continuaci�n descargar� los ficheros de contratos.txt y transacciones.txt para agregarles el nuevo id de transacci�n junto a la firma digital y los subir� a la red P2P estructurada. El deudor comprobar� que el id de transacci�n sea correcto, si despu�s de varios intentos no lo consigue enviar� un mensaje de impago al sistema de reputaci�n de la red P2P estructurada. En caso de conseguirlo, podr� agregar comentarios en el sistema de reputaci�n e iniciar la segunda parte de la transacci�n. En la segunda parte de la transacci�n se realizar�n los mismos pasos detallados anteriormente menos el primero y cambiando los roles de los usuarios (acreedor y deudor). Finalmente el usuario A (deudor) se encargar� de indicar a la red P2P estructurada que la transacci�n se ha realizado con �xito.
		Precondici�n: Servicio existente.
		Postcondici�n: Transacci�n realizada.
	 * @param datosPago
	 * @return
	 */
	Object efectuarPago(Object datosPago);	
	
	/**
	 * Funci�n: Enviar solicitud de preacuerdo.
		ID: Fac02
		Prioridad: Alta.
		Estabilidad: Alta.
		Descripci�n: Enviar una solicitud de preacuerdo para dar/recibir un servicio.
		Entrada: ID usuario emisor, ID usuario receptor, ID del servicio, firma digital del deudor, datetime de la firma.
		Salida: Mensaje de confirmaci�n o rechazo del preacuerdo.
		Origen: Interfaz gr�fica.
		Destino: Sistema.
		Necesita: Estar conectado a la red, el archivo/s de usuarios del sistema cuentas.txt, el archivo/s de servicios del sistema, el archivo/s de contratos de usuarios contratos.txt, claves p�blicas guardadas en cuentas.txt.
		Acci�n: Solicitud de preacuerdo para un servicio.
		Precondici�n: Que los dos usuarios existan en el sistema, que el servicio exista en el sistema.
		Postcondici�n: Actualizaci�n del calendario de los dos usuarios en el fichero/s de cuentas de usuarios.

	 * @param datosSolicitud
	 * @return
	 */
	Object enviarSolicitudDePreacuerdo(Object datosSolicitud);
	
	/**
	 * Funci�n: Enviar solicitud de acuerdo.
		ID: Fac03
		Prioridad: Alta.
		Estabilidad: Alta.
		Descripci�n: Enviar una solicitud de acuerdo para dar/recibir un servicio.
		Entrada: ID usuario emisor, ID usuario receptor, ID del servicio, datetime del servicio, firmas digital del acreedor.
		Salida: Mensaje de confirmaci�n o rechazo del acuerdo.
		Origen: Interfaz gr�fica.
		Destino: Sistema.
		Necesita: Estar conectado a la red, el archivo/s de usuarios del sistema cuentas.txt, el archivo/s de servicios del sistema, el archivo/s de contratos de usuarios contratos.txt, claves p�blicas guardadas en cuentas.txt.
		Acci�n: Solicitud de preacuerdo para un servicio.
		Precondici�n: Que los dos usuarios existan en el sistema, que el servicio exista en el sistema, que ese servicio se ofrezca el d�a solicitado.
	 * @param datosSolicitud
	 * @return
	 */
	Object enviarSolicitudDeAcuerdo(Object datosSolicitud);
	
	/**
	 * Funci�n: Cancelar solicitud de servicio
		ID: Fac04
		Prioridad: Alta.
		Estabilidad: Media.
		Descripci�n: Se rechaza una solicitud de servicio por parte del deudor.
		Entrada: ID del servicio, ID del usuario.
		Salida: Notificaci�n de �xito/fallo.
		Origen: Interfaz gr�fica.
		Destino: Sistema.
		Necesita: Estar conectado a la red, fichero de usuarios y ficheros de acuerdos.
		Acci�n: El sistema modifica la entrada correspondiente al acuerdo.
		Precondici�n: Servicio existente y solicitado, pero sin preacuerdo.
		Postcondici�n: Entrada del acuerdo modificada.
	 * @param datosSolicitud
	 * @return
	 */
	Object cancelarSolicitudDeServicio(Object datosSolicitud);
	
	/**
	 * Funci�n: Cancelar servicio
		ID: Fac05
		Prioridad: Alta.
		Estabilidad: Media.
		Descripci�n: Se cancela una oferta de servicio por parte del acreedor.
		Entrada: ID del servicio, ID del usuario.
		Salida: Notificaci�n de �xito/fallo.
		Origen: Interfaz gr�fica.
		Destino: Sistema.
		Necesita: Estar conectado a la red, fichero de usuarios y ficheros de acuerdos.
		Acci�n: El sistema modifica la entrada correspondiente al acuerdo.
		Precondici�n: Servicio existente.
		Postcondici�n: Entrada del acuerdo modificada.
	 * 
	 * @param datosSolicitud
	 * @return
	 */
	Object cancelarServicio(Object datosSolicitud);	
	
	/**
	 * Funci�n: Rechazar servicio
		ID: Fac06
		Prioridad: Alta.
		Estabilidad: Media.
		Descripci�n: Se rechaza una solicitud de servicio por parte del acreedor.
		Entrada: ID del servicio.
		Salida: Notificaci�n de �xito/fallo.
		Origen: Interfaz gr�fica.
		Destino: Sistema.
		Necesita: Estar conectado a la red, fichero de usuarios y ficheros de acuerdos.
		Acci�n: El sistema modifica la entrada correspondiente al acuerdo.
		Precondici�n: Servicio existente.
		Postcondici�n: Entrada del acuerdo modificada.
	 * @param datosSolicitud
	 * @return
	 */
	Object rechazarServicio(Object datosSolicitud);	
	
}
